package com.glink.manage.service;

import com.baomidou.mybatisplus.core.metadata.IPage;
import com.baomidou.mybatisplus.extension.service.IService;
import com.glink.common.exception.GeneralSimpleException;
import com.glink.manage.domain.BarriersBean;
import com.glink.manage.dto.barriers.*;
import com.glink.manage.vo.barriers.BarriersBaseVO;
import com.glink.manage.vo.barriers.BarriersFindVO;
import com.glink.manage.vo.barriers.BarriersTreeVO;
import com.glink.manage.vo.barriers.BarriersVO;

import java.io.ByteArrayOutputStream;
import java.io.IOException;
import java.util.List;

public interface BarriersService extends IService<BarriersBean> {
    
    /**
     * 分页查询行人
     * @param barriersPageDTO 查询信息
     * @return 行人信息
     */
    IPage<BarriersVO> findBarriersPagePeople(BarriersPageDTO barriersPageDTO) throws GeneralSimpleException;

    /**
     * 分页查询车辆
     * @param barriersPageDTO 查询信息
     * @return 车辆信息
     */
    IPage<BarriersVO> findBarriersPageCar(BarriersPageDTO barriersPageDTO) throws GeneralSimpleException;

    /**
     * 保存行人设备
     * @param barriersDTO 保存行人设备信息
     * @return 保存行人设备状态
     */
    boolean saveBarriersPeople(BarriersDTO barriersDTO) throws GeneralSimpleException;  // 保存设备

    /**
     * 保存车辆设备
     * @param barriersDTO 保存车辆设备信息
     * @return 保存车辆设备信息状态
     */
    boolean saveBarriersCar(BarriersDTO barriersDTO) throws GeneralSimpleException;  // 保存设备

    /**
     * 更新设备
     * @param barriersUpdateDTO 更新设备信息
     * @return 更新设备状态
     */
    boolean updateBarriers(BarriersUpdateDTO barriersUpdateDTO) throws GeneralSimpleException;  // 更新设备

    /**
     * 删除设备
     * @param objIdList 删除设备信息
     * @return 删除设备状态
     */
    boolean deleteBarriers(List<String> objIdList);  // 批量删除设备

    /**
     * 导出设备
     * @param barriersPageDTO 导出设备信息
     * @param distinguish 行人/车辆
     * @return execl文档
     * @throws IOException 输出
     */
    ByteArrayOutputStream exportBarriersData(BarriersPageDTO barriersPageDTO, String distinguish) throws IOException;

    /**
     * 主键ID查询设备信息
     * @param barriersFindDTO 主键ID
     * @param distinguish 行人/车辆
     * @return 行人/车辆设备信息
     */
    BarriersFindVO findBarriers(BarriersFindDTO barriersFindDTO, String distinguish);

    /**
     * 查询行人/车辆设备树
     * @param barriersTreeDTO 树结构信息
     * @return 树结构
     */
    List<BarriersTreeVO> findTree(BarriersTreeDTO barriersTreeDTO) throws GeneralSimpleException;

    /**
     * 根据产品序列号查询设备
     * @param devSno 设备号
     * @return 设备信息
     */
    BarriersBaseVO findByFactorySerialNumberAndOnLine(String devSno);

    /**
     * 设备在线
     * @param devSno 设备号
     */
    void beOnlineByFactorySerialNumber(String devSno);

    /**
     * 设备离线
     * @param devSno 设备号
     */
    void offlineByFactorySerialNumber(String devSno);
    
    /**
     * 根据工程ID查询设备号
     * @param workIdList 工程ID
     * @return 设备号
     */
    List<String> findFactorySerialNumberByWorkIdIn(List<String> workIdList, String onlineStatus);
    List<BarriersBean> findByWorkIdInAndDistinguish(List<String> workIdList, String distinguish, String onlineStatus);

    /**
     * 根据设备类型查询道闸设备号
     * @param distinguish 设备类型
     * @return 道闸设备号
     */
    List<String> findFactorySerialNumberByDistinguish(String distinguish);
    
    /**
     * 根据设备类型查询道闸设备号
     * @param distinguish 设备类型
     * @param workIdList 施工工程ID
     * @return 道闸设备号
     */
    List<BarriersBean> findFactorySerialNumberByDistinguishAndWorkIdIn(String distinguish, List<String> workIdList);

    /**
     * 根据设备号查询所属工程
     * @param devSno 设备号
     * @return 工程ID
     */
    String findWorkIdByFactorySerialNumber(String devSno);

    /**
     * 更新设备在线状态
     */
    void updateBarriersOnlineStatus();

    /**
     * 根据在线状态查询所有的设备
     * @param onlineStatus 在线状态
     */
    List<BarriersBean> findAllByOnLineStatus(String onlineStatus);
}
